package com.w3c.pragmatic.service;

import java.util.concurrent.TimeUnit;

/**
 * 定义redisson锁接口（用于适配redisson锁相应方法）
 *
 * @author wangdong
 * @since 2021/12/17 9:28
 */
public interface IRedissonCustomer {

    /**
     * 通过key加锁
     *
     * @param lockKey 锁键
     */
    void lock(String lockKey);

    /**
     * 通过key加锁并设置加锁时间
     *
     * @param lockKey 锁键
     * @param timeout 锁失效时间（默认秒）
     */
    void lock(String lockKey, long timeout);

    /**
     * 通过key加锁并设置加锁时间
     *
     * @param lockKey 锁键
     * @param unit    时间单位
     * @param timeout 锁失效时间
     */
    void lock(String lockKey, TimeUnit unit, long timeout);

    /**
     * 尝试获取锁（获取不到等待leaseTime，获取到timeout后失效）
     *
     * @param lockKey   锁键
     * @param unit      时间单位
     * @param leaseTime 获取不到锁自旋等待时间
     * @return 最终获取锁状态
     * @throws InterruptedException 异常处理
     */
    boolean tryLock(String lockKey, TimeUnit unit, long leaseTime)
            throws InterruptedException;

    /**
     * 尝试获取锁（获取不到等待leaseTime，获取到timeout后失效）
     *
     * @param lockKey   锁键
     * @param unit      时间单位
     * @param leaseTime 获取不到锁自旋等待时间
     * @param timeout   获取到锁后锁失效时间
     * @return 最终获取锁状态
     * @throws InterruptedException 异常处理
     */
    boolean tryLock(String lockKey, TimeUnit unit, long leaseTime, long timeout)
            throws InterruptedException;

    /**
     * 通过key释放锁
     *
     * @param lockKey 锁键
     */
    void unlock(String lockKey);
}
